package com.mh.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * Date:2023/7/31
 * author:zmh
 * description: 通用接口
 **/

@RequestMapping("/commons")
@CrossOrigin
@RestController
@Slf4j
public class CommonsController {

    @Value("${picturePath}")
    private String picturePath;

    /**
     * 获取图片（文件下载接口）
     * @return 返回字节数据流
     * @throws  ·
     */
    @GetMapping("/download")
    public ResponseEntity<Resource> getImage(String picName) {
        // 处理目录路径拼接问题
        picName = picName.replace("$", "/");
        String randomPic = picturePath + picName;
        log.info("获取图片路径==>{}", randomPic);

        File file = new File(randomPic);

        if(!file.exists()){
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);  // 设置响应类型二进制流类型

        Resource resource = new FileSystemResource(file);
        try{
            headers.setContentLength(resource.contentLength());  // 设置响应内容得长度
        }catch(IOException e){
            return new ResponseEntity<>(headers, HttpStatus.INTERNAL_SERVER_ERROR);
        }

        return new ResponseEntity<>(resource, headers, HttpStatus.OK);
    }

    /**
     * 文件上传接口
     * @param file 前端传入的文件对象
     * @return 返回存在服务器的文件名称
     */
    @PostMapping("/upload")
    public String fileUpload(@RequestParam("file") MultipartFile file){

        // 获取上传的图片文件后缀名
        String originalFilename = file.getOriginalFilename();
        String fileExtension = originalFilename.substring(originalFilename.lastIndexOf('.'));

        // 检查文件是否为空
        if (file.isEmpty()) {
            return "File is empty!";
        }

        // 检查文件名是否合法,避免目录遍历攻击
        String fileName = StringUtils.cleanPath(originalFilename);
        if (fileName.contains("..")) {
            return "Illegal name!";
        }

        try {
            // 给上传的图片随机生成一个名称，将之返回，
            // 用户就可以根据此名称下载图片，防止图片名称冲突。
            UUID uuid = UUID.randomUUID();
            String randomUUIDString = uuid.toString();
            // 将文件保存到指定目录文件
            File targetFile = new File(this.picturePath + randomUUIDString + fileExtension);
            // 将传入的图片转存到指定目录文件
            file.transferTo(targetFile);
            // 返回随机名称（带有后缀名）
            return randomUUIDString + fileExtension;

        } catch (IOException e) {
            e.printStackTrace();
            return "server error!";
        }
    }
}
